﻿Imports System.IO
Imports PowerTools

Namespace Classes
    Public Class AggregationFichiersPouvoir
        Public Fichiers As New Dictionary(Of String, Fichier)

        Public ReadOnly Property FichiersActifs As IEnumerable(Of Fichier)
            Get
                Return Fichiers.Values.Where(Function(Fic) Fic.Actif = True)
            End Get
        End Property

        Public ReadOnly Property NombrePouvoirs As Integer
            Get
                Return FichiersActifs.Sum(Function(fic) fic.ContenuXml.PouvoirsNonSupprimes.Count())
            End Get
        End Property

        Public ReadOnly Property NombreTraits As Integer
            Get
                Return FichiersActifs.Sum(Function(fic) fic.ContenuXml.TraitsNonSupprimes.Count())
            End Get
        End Property

        Public ReadOnly Property NombreAptitudes As Integer
            Get
                Return FichiersActifs.Sum(Function(fic) fic.ContenuXml.AptitudesNonSupprimes.Count())
            End Get
        End Property

        ''' <summary>
        ''' Renvoie tout les pouvoirs, quelqu'ils soient
        ''' </summary>
        ''' <returns>Tout les pouvoirs</returns>
        Public Function Capacites() As IEnumerable(Of PouvoirsXMLPouvoir)
            Return FichiersActifs.SelectMany(Function(fic) fic.ContenuXml.CapacitesNonSupprimes)
        End Function

        Public ReadOnly Property Traits As IEnumerable(Of PouvoirsXMLPouvoir)
            Get
                Return FichiersActifs.SelectMany(Function(fic) fic.ContenuXml.TraitsNonSupprimes)
            End Get
        End Property

        Public ReadOnly Property Aptitudes As IEnumerable(Of PouvoirsXMLPouvoir)
            Get
                Return FichiersActifs.SelectMany(Function(fic) fic.ContenuXml.AptitudesNonSupprimes)
            End Get
        End Property

        Public ReadOnly Property Pouvoirs As IEnumerable(Of PouvoirsXMLPouvoir)
            Get
                Return FichiersActifs.SelectMany(Function(fic) fic.ContenuXml.PouvoirsNonSupprimes)
            End Get
        End Property

        Public Function Manuels() As IEnumerable(Of PouvoirsXMLManuel)
            Return FichiersActifs.SelectMany(Function(fic) fic.ContenuXml.manuel)
        End Function

        Public Function ObtenirCapacite(ByVal ligne As LigneGrille) As PouvoirsXMLPouvoir
            Dim p As PouvoirsXMLPouvoir
            Select Case ligne.TypeCapacite
                Case enumTypePouvoir.Trait
                    p = Traits.SingleOrDefault(Function(t) (t.Id = ligne.ID))
                Case enumTypePouvoir.Aptitude
                    p = Aptitudes.SingleOrDefault(Function(t) (t.Id = ligne.ID))
                Case enumTypePouvoir.Pouvoir
                    p = Pouvoirs.SingleOrDefault(Function(t) (t.Id = ligne.ID))
                Case Else
                    Throw New ArgumentException("Mauvaise valeur typeCap " + ligne.TypeCapacite)
            End Select
            Return p
        End Function

        Sub ExclureManuels(exclus As IEnumerable(Of String))
            For Each fic As Fichier In FichiersActifs
                fic.ContenuXml.ExclureManuel(exclus)
            Next
        End Sub

        Function AjouterFichier(newPouvoirs As PouvoirsXML, chemin As String, actif As Boolean) As Fichier
            Dim fic As New Fichier
            fic.CheminComplet = chemin
            fic.ContenuXml = newPouvoirs
            fic.Actif = actif
            Fichiers.Add(chemin, fic)
            Return fic
        End Function

        Sub SupprimerPouvoir(pouvoir As PouvoirsXMLPouvoir)
            For Each fic As Fichier In FichiersActifs
                If Object.ReferenceEquals(fic.ContenuXml, pouvoir.Fichier) Then
                    fic.SupprimerCapacite(pouvoir)
                End If
            Next
        End Sub

        Sub ChargerFichiersDesSettings()
            Dim FichiersCharges As List(Of String) = My.Settings.FichiersCharges.Split("/").ToList()
            Fichiers.Clear()
            If String.IsNullOrEmpty(My.Settings.FichiersCharges) Then
                Return
            End If
            For Each fic As String In FichiersCharges
                Dim chemin As String = System.IO.Path.Combine(CheminXMLs, fic)
                Dim p As PouvoirsXML = Chargements.ChargerFichierPouvoirs(chemin)
                If (Not p Is Nothing) Then
                    AjouterFichier(p, chemin, True)
                End If
            Next
        End Sub

        Sub AjouterFichier(ByVal fic As Fichier)
            Fichiers.Add(fic.CheminComplet, fic)
        End Sub

        Public ReadOnly Property IsSomethingDirty As Boolean
            Get
                Return FichiersActifs.Any(Function(x) x.IsDirty)
            End Get
        End Property

        Sub SetDirty(Fichier As PouvoirsXML, valeur As Boolean)
            Fichiers.Values.Single(Function(x) Object.ReferenceEquals(Fichier, x.ContenuXml)).IsDirty = True
        End Sub

    End Class

    Public Class Fichier
        Public CheminComplet As String
        Public Actif As Boolean
        Public ContenuXml As PouvoirsXML
        Public ReadOnly Property Titre As String
            Get
                If ContenuXml Is Nothing Then
                    Return Path.GetFileNameWithoutExtension(CheminComplet)
                End If
                Return ContenuXml.Titre
            End Get
        End Property
        Public IsDirty As Boolean

        ReadOnly Property CapacitesModifiees As IEnumerable(Of PouvoirsXMLPouvoir)
            Get
                Return ContenuXml.Capacites.Where(Function(c) c.Modifie <> PowerTools.enumTypeModification.Aucune)
            End Get
        End Property

        Public Overrides Function ToString() As String
            Try
                If ContenuXml Is Nothing Then
                    Return Titre
                End If
                Return String.Format("{0} ({1})", ContenuXml.Titre, ContenuXml.Version)
            Catch ex As Exception
                MessageErreur(ex, "Erreur")
                Return ex.Message
            End Try
        End Function

        Public Function Sauver() As Boolean
            Dim retour As Boolean
            retour = ContenuXml.SauverXML(CheminComplet)
            If retour Then IsDirty = False
            Return retour
        End Function

        Sub SupprimerCapacite(pouvoir As PouvoirsXMLPouvoir)
            If ContenuXml Is Nothing Then Return
            ContenuXml.SupprimerCapacite(pouvoir)
            IsDirty = True
        End Sub

        Public Overrides Function GetHashCode() As Integer
            Return CheminComplet.GetHashCode()
        End Function
        Sub AjouterCapacite(ByVal pouvoirEnCours As PouvoirsXMLPouvoir)
            pouvoirEnCours.Modifie = PowerTools.enumTypeModification.Ajouté
            pouvoirEnCours.Id = DateTime.Now.ToString("mmss") & "-" & pouvoirEnCours.GetHashCode()
            pouvoirEnCours.idpouvoir = pouvoirEnCours.Id
            pouvoirEnCours.Fichier = ContenuXml
            ContenuXml.pouvoir.Add(pouvoirEnCours)
            Me.IsDirty = True
        End Sub

    End Class
End Namespace